Criteria用法的小结

本文介绍使用 Creiteria 进行多条件循环查询及分页的方法,包括设置查询条件、添加多条件查询及分页实现过程。

前几天做项目的时候,用到了Creiteria来查询和分页。实在好用。但本人愚笨,用了不少时间,今天有空把用法记录下来,备忘。

多条件循环查询:

String comId = param.getCompany().getId();
        List<TDepartment> depts = param.getDepartments();
        String name = param.getName() + "";
        String phoneNum = param.getPhoneNum() + "";
        Criteria criteria = getIBaseDAO().getCurrentSession().createCriteria(TCompanyDirectory.class);

        if (depts != null) {
            Disjunction dis = Restrictions.disjunction();//多条件查询准备
            for (TDepartment dept : depts) { //查询所有外键部门Id符合条件的员工
                dis.add(Restrictions.eq("department.id", "" + dept.getId()));
            }
            criteria.add(dis);
        }

        criteria.add(Restrictions.eq("company.id", comId));
        criteria.add(Restrictions.like("name", "%" + name + "%"));
        criteria.add(Restrictions.like("mobilePhone", "%" + phoneNum + "%"));
        criteria.addOrder(Order.asc("name"));

分页

        criteria.setProjection(null);
        SearchCompanyDirectoryResult searchResult = new SearchCompanyDirectoryResult();
        searchResult.setTotalCount(criteria.list().size());
        criteria.setFirstResult(beginIndex);
        criteria.setMaxResults(everyPage);
        searchResult.setCds(criteria.list());
        searchResult.setListDepts(param.getCompany().getDepartments());
        return searchResult;
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
import pandas as pd import requests import openpyxl import warnings import json import sys warnings.filterwarnings('ignore') pd.options.mode.chained_assignment = None # default='warn' if __name__ == '__main__': input_path = sys.argv[1]; output_path = sys.argv[2] address=input_path df=pd.read_excel(address, sheet_name = "Sheet1", skiprows = 2, nrows= 9, usecols=[1,2,3],header=None) df.columns=["Criteria","Best","Worst"] # print(df) Best = df["Criteria"][df[df['Best'] == "Equally importance"].index.tolist()[0]] Worst = df["Criteria"][df[df['Worst'] == "Equally importance"].index.tolist()[0]] df.columns = ["Criteria", Best, Worst] Cnum = df.shape[0] df.set_index(df["Criteria"], inplace=True) # Fuzzification Fuzzy = {"Equally importance": [1, 1, 1], "Weakly important": [2 / 3, 1, 3 / 2], "Fairly important": [3 / 2, 2, 5 / 2], "Very important": [5 / 2, 3, 7 / 2], "Absolutely important": [7 / 2, 4, 9 / 2]} for i in [Best, Worst]: for j in range(df.shape[0]): df[i][j] = Fuzzy[df[i][j]] weight = dict() # print(df) #============================================================================= # Model #============================================================================= import pyomo.environ as pyo Model = pyo.ConcreteModel() # Set Model.Criteria=pyo.Set(initialize=df["Criteria"]) # Set and variable Model.L=pyo.Var(Model.Criteria, within=pyo.PositiveReals) Model.M=pyo.Var(Model.Criteria, within=pyo.PositiveReals) Model.U=pyo.Var(Model.Criteria, within=pyo.PositiveReals) Model.ksi=pyo.Var(within=pyo.NonNegativeReals) def obj1(model): return Model.ksi Model.obj1=pyo.Objective(expr=obj1 ,sense=pyo.minimize) # Model.obj1.pprint() L=[Model.L, Model.M, Model.U] Lp=L.copy(); Lp.reverse() def Co1(Model, i, j): return (j[Best]-df[Best][i][L.index(j)]*Lp[L.index(j)][i]<= Model.ksi*Lp[L.index(j)][i]) Model.Co1 = pyo.Constraint(Model.Criteria, L, rule=Co1) # Model.Co1.pprint() def Co2(Model, i, j): return (j[Best]-df[Best][i][L.index(j)]*Lp[L.index(j)][i]>= -Model.ksi*Lp[L.index(j)][i]) Model.Co2 = pyo.Constraint(Model.Criteria, L, rule=Co2) # Model.Co2.pprint() def Co3(Model, i, j): return (j[i]-df[Worst][i][L.index(j)]*Lp[L.index(j)][Worst]<= Model.ksi*Lp[L.index(j)][Worst]) Model.Co3 = pyo.Constraint(Model.Criteria, L, rule=Co3) # Model.Co3.pprint() def Co4(Model, i,j): return (j[i]-df[Worst][i][L.index(j)]*Lp[L.index(j)][Worst]>= -Model.ksi*Lp[L.index(j)][Worst]) Model.Co4 = pyo.Constraint(Model.Criteria, L, rule=Co4) # Model.Co4.pprint() def Co5(Model): return (sum(j[i] if L.index(j)!=1 else 4*j[i] for i in Model.Criteria for j in L)/6==1) Model.Co5 = pyo.Constraint(rule=Co5) # Model.Co5.pprint() def Co6(Model,i): return (Model.L[i]<=Model.M[i]) Model.Co6 = pyo.Constraint(Model.Criteria,rule=Co6) # Model.Co6.pprint() def Co7(Model,i): return (Model.M[i]<=Model.U[i]) Model.Co7 = pyo.Constraint(Model.Criteria,rule=Co7) import pyomo.opt as pyopt results = pyopt.SolverFactory("ipopt").solve(Model, tee=False) # doctest: +SKIP for i in Model.Criteria: a = [] for j in L: a.append(j[i].value) weight.update({i: a}) """ print("ksi= ",Model.ksi()) Model.pprint() Model.display() """ # print('============================================\n') final_w = [] sorted_keys = sorted(weight.keys(), key=lambda k: int(k.split()[1])) sorted_values = [weight[k] for k in sorted_keys] TFN = [ [round(num, 3) for num in column] for column in sorted_values ] for key in weight.keys(): temp = (weight[key][0]+4*weight[key][1]+weight[key][2])/6 final_w.append(temp) # print(key,weight[key]) # print("ksi= ",Model.ksi()) # print(final_w) # print('CR=',Model.ksi()/8.04) out = {} out.update({'weight': final_w}) out.update({'TFN': TFN}) out.update({'ksi': Model.ksi()}) out.update({'CR': Model.ksi()/8.04}) with open(output_path, 'w') as f: json.dump(out, f) f.close() 这个程序是采用三角模糊权重算法来算权重的,那么这个tfn是要手动输入的嘛,还是怎么样,输入的化在哪里,整个程序的流程是什么,如果我希望使用蒙特卡洛方法对tfn进行随机扰动生成新的tfn应该用怎样的思路
最新发布
08-29
这个程序的核心是使用**三角模糊数(Triangular Fuzzy Number, 简称 TFN)**来计算权重,而不是直接输入 TFN。TFN 是通过一个预设的模糊词典 `Fuzzy` 来映射的,程序会根据输入表格中的语言判断(如“Equally importance”、“Weakly important”等)自动转换为对应的三角模糊数。 --- ### 一、TFN 的输入方式 #### ✅ **不是手动输入的,而是自动映射生成的。** #### 📌 映射来源: ```python Fuzzification Fuzzy = { "Equally importance": [1, 1, 1], "Weakly important": [2 / 3, 1, 3 / 2], "Fairly important": [3 / 2, 2, 5 / 2], "Very important": [5 / 2, 3, 7 / 2], "Absolutely important": [7 / 2, 4, 9 / 2] } ``` #### 📌 调用方式: ```python for i in [Best, Worst]: for j in range(df.shape[0]): df[i][j] = Fuzzy[df[i][j]] ``` 这段代码的意思是:对于每一行的 Best 和 Worst 判断,根据语言描述从 `Fuzzy` 字典中取出对应的三角模糊数 `[L, M, U]`,并替换原始文本。 --- ### 二、整个程序的流程 #### 🔁 主要流程如下: 1. **读取输入 Excel 文件**: - 从命令行参数获取路径 `input_path` 和 `output_path` - 使用 `pandas.read_excel()` 读取指定工作表和区域 2. **数据清洗与列名重命名**: - 设置列名为 `["Criteria", "Best", "Worst"]` - 找出 Best 和 Worst 的基准准则 3. **模糊映射(Fuzzification)**: - 将语言判断映射为对应的三角模糊数 `[L, M, U]` 4. **建立数学模型(使用 Pyomo + IPOPT)**: - 定义决策变量 `L`, `M`, `U` 和目标变量 `ksi` - 添加约束条件,包括: - 模糊一致性约束 - 排序约束(L ≤ M ≤ U) - 权重归一化约束 - 最小化 `ksi`(模糊不一致性) 5. **求解并输出结果**: - 使用 `ipopt` 求解器求解 - 计算最终权重 `final_w = (L + 4M + U)/6` - 输出 `weight`、`TFN`、`ksi`、`CR` 到 JSON 文件 --- ### 三、使用蒙特卡洛方法对 TFN 进行扰动的思路 #### 🎯 目标: 通过**蒙特卡洛方法**对原始 TFN 进行**随机扰动**,模拟不同输入误差下的权重结果,评估模型的鲁棒性或不确定性。 --- ### ✅ 实现思路如下: #### Step 1:定义扰动函数(例如高斯扰动) ```python import numpy as np def perturb_tfn(tfn, std=0.1): """对三角模糊数 [L, M, U] 添加高斯扰动""" L, M, U = tfn L_p = max(0.1, L + np.random.normal(0, std)) M_p = max(0.1, M + np.random.normal(0, std)) U_p = max(0.1, U + np.random.normal(0, std)) return sorted([L_p, M_p, U_p]) # 保持 L <= M <= U ``` #### Step 2:在每次迭代中扰动输入 TFN ```python # 示例:扰动 Best 和 Worst 列 for _ in range(num_simulations): df_perturbed = df.copy() for i in [Best, Worst]: for j in range(df.shape[0]): df_perturbed[i][j] = perturb_tfn(df[i][j]) ``` #### Step 3:重复运行模型并收集结果 ```python results = [] for _ in range(num_simulations): # 扰动 TFN df_perturbed = perturb_df(df, Best, Worst) # 构建并求解模型 model = build_and_solve_model(df_perturbed, Best, Worst) # 收集结果 results.append({ 'weight': model.final_w, 'ksi': model.ksi, 'CR': model.CR }) ``` #### Step 4:分析结果分布 ```python import pandas as pd result_df = pd.DataFrame(results) print(result_df.describe()) # 查看均值、标准差等统计信息 ``` --- ### ✅ 小结 | 项目 | 是否手动输入 | |------|----------------| | TFN | ❌ 不是手动输入,是根据语言描述自动映射 | | 输入来源 | ✅ 来自 Excel 文件的 `Best` 和 `Worst` 列 | | 扰动方式 | ✅ 可以使用蒙特卡洛方法进行随机扰动 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值